package usj.util;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

public class CListener implements Runnable 
{
	static Logger log = Logger.getLogger(CListener.class);
	private boolean      m_bSalir		 = true;
    private int          m_iServerPort   = 110;
    private ServerSocket m_oServerSocket = null;
    private Socket 		 m_oClientSocket = null;
    private List<CConexion> lista = new ArrayList<CConexion>();
    
    /**
     * Constructor basico 
     * @param port puerto donde abriremos el socket
     * @throws Exception 
     */
    public CListener( int port) throws Exception
    {
    	try
    	{
	    	m_iServerPort = port;
	    	log.info("Creando socket");
	    	m_oServerSocket = new ServerSocket( m_iServerPort );
    	}
    	catch(Exception e)
    	{
    		
    		log.error(" ERROR abriendo el listener en el puerto " + e.getMessage());
    		throw( new Exception(" ERROR abriendo el listener en el puerto " + String.valueOf(port), e ) );
    	}
    }

    /**
	 * Metodo que esta escuchando todo el rato si alguien Abre el sockcet 
	 */
	@Override	public void run() 
	{
		// TODO Auto-generated method stub
		//Seguimos en el bucle hasta que laguien cambie esto.
		m_bSalir = false;
		while( !m_bSalir )
		{			  
			try 
			{
				log.info("Esperando conexion");
				m_oClientSocket = m_oServerSocket.accept();
				log.info("conectado : ");
				log.info( m_oClientSocket.getInetAddress() );
				CConexion c = new CConexion(m_oClientSocket);
				//lista.add(c);
				log.info( "comenzamos a procesar ");
				c.Procesar();
			} 
			catch (Exception e) 
			{
				if( m_bSalir ) 
				{
					log.info("Servidor Parado.") ;					
					return;
				}
				log.error( " ERROR " + e.getMessage());
				log.error(e.getStackTrace());
				e.printStackTrace();
			} 
			

		}		
	}

}
